home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / sbin_-_Static_Binary_Files / PKGTOOL.TTY < prev    next >
Text File  |  1999-09-17  |  23KB  |  696 lines

  1. #!/bin/sh
  2. #
  3. # Copyright 1993 Patrick Volkerding, Moorhead, Minnesota USA
  4. # All rights reserved.
  5. #
  6. # Redistribution and use of this script, with or without modification, is 
  7. # permitted provided that the following conditions are met:
  8. #
  9. # 1. Redistributions of this script must retain the above copyright
  10. #    notice, this list of conditions and the following disclaimer.
  11. #
  12. #  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
  13. #  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  14. #  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
  15. #  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  16. #  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  17. #  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  18. #  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  19. #  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
  20. #  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  21. #  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  22. #
  23.  
  24. # Wed, 27 Apr 1994 00:06:50 -0700 (PDT)
  25. # Optimization by David Hinds.
  26.  
  27. # Wed Mar 18 16:01:41 CST 1998
  28. # Patched possible /tmp security holes.
  29.  
  30. SOURCE_DIR=/var/adm/mount
  31. umask 000
  32. ASK="tagfiles"
  33. if [ ! -d /usr/sbin ]; then # we must be on the bootdisk
  34.  TARGET_DIR=/mnt
  35.  TMP=/mnt/var/log/setup/tmp
  36.  if mount | fgrep "on /mnt" 1> /dev/null 2> /dev/null ; then # good
  37.   echo > /dev/null
  38.  else # bad
  39.   echo
  40.   echo
  41.   echo "You can't run pkgtool from the rootdisk until you've mounted your Linux"
  42.   echo "partitions beneath /mnt. Here are some examples of this:"
  43.   echo
  44.   echo "If your root partition is /dev/hda1, and is using ext2fs, you would type:"
  45.   echo "mount /dev/hda1 /mnt -t ext2"
  46.   echo
  47.   echo "Then, supposing your /usr partition is /dev/hda2, you must do this:"
  48.   echo "mount /dev/hda2 /mnt/usr -t ext2"
  49.   echo
  50.   echo "Please mount your Linux partitions and then run pkgtool again."
  51.   echo
  52.   exit
  53.  fi
  54. else
  55.  TARGET_DIR=/
  56.  TMP=/var/log/setup/tmp
  57. fi
  58. if [ ! -d $TMP ]; then # make a secure temp directory:
  59.  rm -rf $TMP
  60.  mkdir -p $TMP
  61.  chmod 700 $TMP
  62. fi
  63. ADM_DIR=$TARGET_DIR/var/log
  64. # Look for custom tagfile extension, which should be in a file in $TMP:
  65. CUSTOM=""
  66. if [ -r /tmp/custom ]; then
  67.  CUSTOM="`cat /tmp/custom`"
  68. fi
  69.  
  70. keep_files() {
  71.  while read FILE ; do
  72.   if [ -f "$TARGET_DIR/$FILE" ]; then
  73.     echo "  --> $FILE was found in another package. Skipping."
  74.   fi
  75.  done
  76. }
  77.  
  78. keep_links() {
  79.  while read LINK ; do
  80.   echo "Duplicate link. Not executing: $LINK"
  81.  done
  82. }
  83.  
  84. delete_files() {
  85.  while read FILE ; do
  86.   if [ -f "$TARGET_DIR/$FILE" ]; then
  87.     echo "  --> Deleting $FILE"
  88.     rm -f $TARGET_DIR/$FILE
  89.   fi
  90.  done
  91. }
  92.  
  93. delete_links() {
  94.  while read LINK ; do
  95.   echo "Unique link. Executing: $LINK"
  96.  done
  97. }
  98.  
  99. # Conversion to 'comm' utility by Mark Wisdom.
  100. # is pretty nifty! :^)
  101. remove_packages() {
  102.  for package_name in $1 
  103.  do
  104.   echo
  105.   if [ -r $ADM_DIR/packages/$package_name ]; then
  106.    echo "Removing package $package_name..."
  107.    echo
  108.    if fgrep "./" $ADM_DIR/packages/$package_name 1> /dev/null 2>&1; then
  109.     TRIGGER=".\/"
  110.    else
  111.     TRIGGER="FILE LIST:"
  112.    fi
  113.    echo "Removing files:"
  114.    sed -n "/$TRIGGER/,/^$/p" < $ADM_DIR/packages/$package_name | sort -u > $TMP/delete_list
  115.    # Pat's new-new && improved pre-removal routine.
  116.    for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do
  117.     if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi
  118.    done
  119.    mv $ADM_DIR/packages/$package_name $ADM_DIR/removed_packages 1> /dev/null 2>&1
  120.    if [ -r $ADM_DIR/scripts/$package_name ]; then
  121.     cat $ADM_DIR/scripts/$package_name | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
  122.     mv $ADM_DIR/scripts/$package_name $ADM_DIR/removed_scripts 1> /dev/null 2>&1
  123.     cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links
  124.     comm -12 $TMP/del_link_list $TMP/required_links | keep_links
  125.     comm -23 $TMP/del_link_list $TMP/required_links | delete_links
  126.     comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
  127.     ( cd $TARGET_DIR ; sh $TMP/delscript )
  128.     rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
  129.    fi
  130.    cat $ADM_DIR/packages/* | sort -u > $TMP/required_files
  131.    comm -12 $TMP/delete_list $TMP/required_files | keep_files
  132.    comm -23 $TMP/delete_list $TMP/required_files | delete_files
  133.    rm -f $TMP/delete_list $TMP/required_files
  134.   else
  135.    echo "No such package: $package_name. Can't remove."
  136.   fi
  137.  done
  138. }
  139.  
  140. # Here, we read the list of arguments passed to the pkgtool script.
  141. if [ $# -gt 0 ]; then # there are arguments to the command
  142.  while [ $# -gt 0 ]; do
  143.   case "$1" in
  144.   "-sets")
  145.    DISK_SETS=`echo $2 | tr "[A-Z]" "[a-z]"` ; shift 2 ;;
  146.   "-source_mounted")
  147.    SOURCE_MOUNTED="always" ; shift 1 ;;
  148.   "-ignore_tagfiles")
  149.    ASK="never" ; shift 1 ;;
  150.   "-source_dir")
  151.    SOURCE_DIR=$2 ; shift 2 ;;
  152.   "-tagfile")
  153.    USETAG=$2 ; shift 2 ;;
  154.   "-target_dir")
  155.    TARGET_DIR=$2
  156.    ADM_DIR=$TARGET_DIR/var/log
  157.    shift 2 ;;
  158.   "-source_device")
  159.    SOURCE_DEVICE=$2 ; shift 2 ;;
  160.   esac
  161.  done
  162. else  # there were no arguments, so we'll get the needed information from the
  163.       # user and then go on.
  164.  CMD_START="true"
  165.  cat << EOF
  166.  
  167. Welcome to the Slackware package tool (pkgtool v. 3.5.0-tty).
  168.  
  169. EOF
  170.  while [ 0 ]; do
  171.   echo -n "Would you like to [i]nstall or [r]emove packages? "
  172.   read REPLY;
  173.   if [ "$REPLY" = "r" -o "$REPLY" = "R" ]; then
  174.    echo 
  175.    echo "You have installed these packages:"
  176.    ls $ADM_DIR/packages
  177.    echo 
  178.    echo -n "Remove which packages? "
  179.    read REMOVAL_LIST;
  180.    remove_packages "$REMOVAL_LIST"
  181.    echo 
  182.    echo "Packages removed."
  183.    chmod 755 /
  184.    chmod 1777 /tmp
  185.    exit
  186.   elif [ "$REPLY" = "i" -o "$REPLY" = "I" ]; then
  187.     echo
  188.    echo -n "Install from [c]urrent directory, [o]ther directory, or [f]loppy? " 
  189.    read REPLY;
  190.    echo
  191.    if [ "$REPLY" = "f" -o "$REPLY" = "F" ]; then
  192.     cat << EOF
  193. Install from:
  194.  
  195.   1 -- /dev/fd0 (drive 1)
  196.   2 -- /dev/fd1 (drive 2)
  197.  
  198. EOF
  199.     echo -n "Source drive? "
  200.     read REPLY;
  201.     if [ "$REPLY" = "1" ]; then
  202.      SOURCE_DEVICE="/dev/fd0"
  203.     elif [ "$REPLY" = "2" ]; then
  204.      SOURCE_DEVICE="/dev/fd1"
  205.     else
  206.      echo "Not a proper choice. Bye bye!"
  207.      exit 
  208.     fi
  209.     cat << EOF
  210.  
  211. Enter the names of any disk sets you would like to install.
  212. Seperate the sets with a space, like this: a b oi x
  213.  
  214. To install packages from one disk, hit [enter] without typing
  215. anything.
  216.  
  217. EOF
  218.     echo -n "Disk sets ==> "
  219.     read DISK_SETS;
  220.     if [ "$DISK_SETS" = "" ]; then
  221.      DISK_SETS="disk"
  222.     else
  223.      DISK_SETS=`echo $DISK_SETS | sed 's/ /#/g'`
  224.      DISK_SETS="#$DISK_SETS"
  225.     fi
  226.     break;
  227.    elif [ "$REPLY" = "o" -o "$REPLY" = "O" ]; then
  228.     echo
  229.     echo "What directory would you like to install"
  230.     echo -n "packages from? " 
  231.     read SOURCE_DIR;
  232.     SOURCE_MOUNTED="always"
  233.     DISK_SETS="disk"
  234.     chmod 755 $TARGET_DIR
  235.     chmod 1777 $TARGET_DIR/tmp
  236.     break;
  237.    elif [ "$REPLY" = "c" -o "$REPLY" = "C" ]; then # installing from current directory
  238.     SOURCE_MOUNTED="always"
  239.     SOURCE_DIR="$PWD"
  240.     DISK_SETS="disk" 
  241.     chmod 755 $TARGET_DIR
  242.     chmod 1777 $TARGET_DIR/tmp
  243.     break;
  244.    fi
  245.   fi 
  246.  done
  247. fi
  248. if [ "$DISK_SETS" = "disk" ]; then
  249.  ASK="always"
  250. fi
  251.  
  252. for DIR in $ADM_DIR $ADM_DIR/packages $ADM_DIR/scripts $ADM_DIR/disk_contents
  253. do
  254.  if [ ! -d $DIR ]; then mkdir -p $DIR ; chmod 755 $DIR ; fi
  255. done
  256.  
  257. if [ ! -d $ADM_DIR/mount -a ! -L $ADM_DIR/mount ]; then
  258.  mkdir -p $ADM_DIR/mount ; chmod 755 $ADM_DIR/mount
  259. fi
  260.  
  261. mount_the_source() {
  262.  # is the source supposed to be mounted already?
  263.  if [ "$SOURCE_MOUNTED" = "always" ]; then
  264.   # The source should already be mounted, so we test it
  265.   if [ ! -d $SOURCE_DIR ]; then # the directory is missing
  266.    cat << EOF
  267.  
  268. Your source device cannot be accessed properly.
  269.  
  270. Please be sure that it is mounted on /var/adm/mount, and that
  271. the Slackware disks are found in subdirectories of
  272. $SOURCE_DIR like specified.
  273. EOF
  274.    exit 1;
  275.   fi
  276.   return 0;
  277.  fi
  278.  echo 
  279.  if [ ! "$1" = "single_disk" ]; then
  280.   echo "Please insert disk $1 and press [enter] to continue, [s] to skip this"
  281.   echo -n "series, or [q] to quit installing software altogether. " 
  282.  else
  283.   echo "Please insert disk to install packages from and press [enter], or"
  284.   echo -n "type [q] to abort. "
  285.  fi
  286.  read REPLY;
  287.  echo 
  288.  if [ "$REPLY" = "s" ]; then
  289.   return 1;
  290.  fi
  291.  if [ "$REPLY" = "q" ]; then
  292.   if [ "$DISK_SETS" = "disk" ]; then
  293.    echo "Aborting..."
  294.    echo 
  295.   else
  296.    cat << EOF
  297. Aborting software installation and skipping ahead
  298. to boot disk creation. Press control-c if you want
  299. to exit the installation program completely.
  300.  
  301. EOF
  302.   fi
  303.   chmod 755 $TARGET_DIR
  304.   chmod 1777 $TARGET_DIR/tmp
  305.   exit 1;
  306.  fi;
  307.  # Old line:
  308.  # mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
  309.  # New ones: (thanks to Andy Schwierskott!)
  310.  go_on=y
  311.  not_successfull_mounted=1
  312.  while [ "$go_on" = y -a "$not_successfull_mounted" = 1 ]; do
  313.     mount -r -t msdos $SOURCE_DEVICE $SOURCE_DIR
  314.     not_successfull_mounted=$?
  315.     if [ "$not_successfull_mounted" = 1 ]; then
  316.        mount_answer=x
  317.        while [ "$mount_answer" != "y" -a "$mount_answer" != "q" ] ; do
  318.           echo -n "Media couldn't be mounted. Retry [y] or quit [q]? "
  319.           read mount_answer
  320.        done
  321.        go_on=$mount_answer
  322.     fi
  323.  done
  324.  test $not_successfull_mounted = 0
  325. }
  326. umount_the_source() {
  327.  if [ ! "$SOURCE_MOUNTED" = "always" ]; then
  328.   umount $SOURCE_DEVICE 1> /dev/null 2>&1
  329.  fi;
  330. }
  331. # The function below installs the package with the name $CURRENT_PACKAGE_NAME
  332. # and with the DOS file extension $CURRENT_PACKAGE_EXTENSION.
  333. install_the_current_package() {
  334. # we probably want to use thes  next 2 to delete the old package correctly, i
  335. # but we'll leave implementing that for later...
  336.  rm -f $ADM_DIR/removed_packages/$CURRENT_PACKAGE_NAME
  337.  rm -f $ADM_DIR/removed_scripts/$CURRENT_PACKAGE_NAME
  338.  echo "PACKAGE NAME:     $CURRENT_PACKAGE_NAME" > $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  339.  KSIZE=`expr $PACKAGE_SIZE / 1024`
  340.  echo "PACKAGE SIZE:     $KSIZE K" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  341.  BASE_DISK_NAME=`basename $PACKAGE_DIR/disk*`
  342.  echo "PACKAGE LOCATION: $BASE_DISK_NAME" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  343.  echo "PACKAGE DESCRIPTION:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  344.  if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  345.   fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/$BASE_DISK_NAME >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null
  346.  fi
  347.  echo "FILE LIST:" >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  348.  # Pat's new-new pre-install cleanup routine.
  349.  for DIR in $ADM_DIR/removed_packages $ADM_DIR/removed_scripts ; do
  350.   if [ ! -d $DIR ] ; then mkdir -p $DIR ; chmod 755 $DIR ; fi
  351.  done
  352.  mv $ADM_DIR/packages/$CURRENT_PACKAGE_NAME $ADM_DIR/removed_packages 1> /dev/null 2>/dev/null
  353.  if [ -r $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME ]; then
  354.   cat $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
  355.   mv $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME $ADM_DIR/removed_scripts 1> /dev/null 2>&1
  356.   ( cat $ADM_DIR/scripts/* ; \
  357.     tar xzOf $PACKAGE_DIR/$CURRENT_PACKAGE_NAME$CURRENT_PACKAGE_EXTENSION ) | \
  358.     fgrep 'rm -rf' | sort -u > $TMP/required_links
  359.   comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
  360.   ( cd $TARGET_DIR ; sh $TMP/delscript )
  361.   rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
  362.  fi
  363.  echo "Installing package $CURRENT_PACKAGE_NAME... "
  364.  if [ "$CURRENT_PACKAGE_EXTENSION" = ".tar" ]; then
  365.   (cd $TARGET_DIR; tar -xlpvf - ) < $PACKAGE_DIR/$CURRENT_PACKAGE_NAME$CURRENT_PACKAGE_EXTENSION >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null
  366.  else
  367.   (cd $TARGET_DIR; gzip -cd | tar -xlpvf - ) < $PACKAGE_DIR/$CURRENT_PACKAGE_NAME$CURRENT_PACKAGE_EXTENSION >> $ADM_DIR/packages/$CURRENT_PACKAGE_NAME 2> /dev/null
  368.  fi
  369.  chmod 644 $ADM_DIR/packages/$CURRENT_PACKAGE_NAME
  370.  if [ -f $TARGET_DIR/install/doinst.sh ]; then
  371.   echo "Executing installation script for package $CURRENT_PACKAGE_NAME... "
  372.   (cd $TARGET_DIR; sh $TARGET_DIR/install/doinst.sh -install; )
  373.   cp $TARGET_DIR/install/doinst.sh $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
  374.   chmod 755 $ADM_DIR/scripts/$CURRENT_PACKAGE_NAME
  375.   # Clean up the mess...
  376.   if [ -d $TARGET_DIR/install ]; then
  377.    (cd $TARGET_DIR/install ; rm -r -f doin* 1> /dev/null 2>&1 )
  378.    rmdir $TARGET_DIR/install 1> /dev/null 2>&1
  379.   fi
  380.  fi
  381.  # Now we reload the shell hash table in case we've added something useful
  382.  # to the command path:
  383.  hash -r
  384.  echo "Done installing package $CURRENT_PACKAGE_NAME."
  385. }
  386. install_disk() {
  387.  mount_the_source $1
  388.  if [ $? = 1 ]; then
  389.   umount_the_source;
  390.   return 1;
  391.  fi
  392.  CURRENT_DISK_NAME="$1"
  393.  PACKAGE_DIR=$SOURCE_DIR
  394.  if [ "$SOURCE_MOUNTED" = "always" -a ! "$DISK_SETS" = "disk" ]; then
  395.    PACKAGE_DIR=$PACKAGE_DIR/$1
  396.  fi
  397.  if [ ! "DISK_SETS" = "disk" ]; then
  398.   touch $TMP/tagfile
  399.   if [ -r $PACKAGE_DIR/tagfile$CUSTOM ]; then
  400.    cat $PACKAGE_DIR/tagfile$CUSTOM >> $TMP/tagfile
  401.    chmod 600 $TMP/tagfile
  402.   elif [ -r $PACKAGE_DIR/tagfile ]; then
  403.    cat $PACKAGE_DIR/tagfile >> $TMP/tagfile
  404.    chmod 600 $TMP/tagfile
  405.   fi
  406.  fi
  407.  if [ ! "$USETAG" = "" ]; then # override with tagfile given on command line
  408.   cat $USETAG > $TMP/tagfile
  409.  fi
  410.  if [ "$1" = "single_disk" -o -r $PACKAGE_DIR/disk$1 ]; then
  411.   CATALOG_FILE=`basename $PACKAGE_DIR/disk*`;
  412.   if [ -r $PACKAGE_DIR/$CATALOG_FILE -a ! -d $PACKAGE_DIR/$CATALOG_FILE ]; then
  413.    if fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE 1> /dev/null 2>&1 ; then
  414.     # First we check for missing packages...
  415.     for PKGTEST in `fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10-` ; do
  416.      if [ ! -r $PACKAGE_DIR/$PKGTEST.tgz ]; then
  417.       cat << EOF
  418.  
  419. WARNING!!!
  420.  
  421. While looking through your index file ($CATALOG_FILE), I noticed that you
  422. might be missing a package ($PKGTEST.tgz) that is supposed to be on this
  423. disk (disk $1). You may go on with the installation if you wish, but if this
  424. is a crucial file I'm making no promises that your machine will boot.
  425.  
  426. Press [enter] to continue...
  427. EOF
  428.       read JUNK_INPUT;
  429.      fi
  430.     done # checking for missing packages
  431.     # Now we test for extra packages
  432.     ALLOWED="`fgrep CONTENTS: $PACKAGE_DIR/$CATALOG_FILE | cut -b10-`" 
  433.     for PACKAGE_FILENAME in $PACKAGE_DIR/*.tgz; do
  434.      BASE="`basename $PACKAGE_FILENAME .tgz`"
  435.      if echo $ALLOWED | fgrep $BASE 1> /dev/null 2>&1 ; then
  436.       GOOD="yup yup"
  437.      else
  438.       cat << EOF
  439.  
  440. WARNING!!!
  441.  
  442. While looking through your index file ($CATALOG_FILE), I noticed that you
  443. have this extra package ($BASE.tgz) that I don't recongnize. Please be sure
  444. this package is really supposed to be here, and is not left over from an old
  445. version of Slackware. Sometimes this can happen at the archive sites.
  446.  
  447. Press [enter] to continue...
  448.  
  449. EOF
  450.       read JUNK_INPUT;
  451.      fi
  452.     done 
  453.    fi
  454.    cat $PACKAGE_DIR/$CATALOG_FILE > $ADM_DIR/disk_contents/$CATALOG_FILE
  455.    chmod 644 $ADM_DIR/disk_contents/$CATALOG_FILE
  456.   fi
  457.   for TEST_EXTENSION in .tgz .tar; do
  458.    for PACKAGE_FILENAME in $PACKAGE_DIR/*$TEST_EXTENSION; do
  459.     if [ "$PACKAGE_FILENAME" = "$PACKAGE_DIR/*$TEST_EXTENSION" ]; then
  460.      continue;
  461.     fi
  462.     CURRENT_PACKAGE_NAME=`basename $PACKAGE_FILENAME $TEST_EXTENSION`
  463.     CURRENT_PACKAGE_EXTENSION=$TEST_EXTENSION
  464.     AddKey=""
  465.     SkipKey=""
  466.     if [ "$ASK" = "tagfiles" -a ! "$DISK_SETS" = "disk" ]; then
  467.      if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep ADD > /dev/null 2> /dev/null ; then
  468.       AddKey="ADD"
  469.      fi
  470.      if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep SKP > /dev/null 2> /dev/null ; then
  471.       SkipKey="SKIP"
  472.      fi
  473.     elif [ "$ASK" = "never" ]; then
  474.      AddKey="ADD"
  475.     else # ASK must equal always
  476.      ASK="always"
  477.      fi  
  478.     if [ ! "$DISK_SETS" = "disk" ]; then
  479.      if fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep ADD > /dev/null 2> /dev/null ; then
  480.       PRIORITY="[required]"
  481.      elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep REC > /dev/null 2> /dev/null ; then
  482.       PRIORITY="[recommended]"
  483.      elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep OPT > /dev/null 2> /dev/null ; then
  484.       PRIORITY="[optional]"
  485.      elif fgrep "$CURRENT_PACKAGE_NAME:" $TMP/tagfile | sed -n '$ p' | fgrep SKP > /dev/null 2> /dev/null ; then
  486.       PRIORITY="[skip]"
  487.      else
  488.       PRIORITY="[unknown]"
  489.      fi
  490.     fi
  491.     echo
  492.     PACKAGE_SIZE=`filesize $PACKAGE_FILENAME`
  493.     if [ "$AddKey" = "ADD" ]; then
  494.      echo "Auto-installing package ==>$CURRENT_PACKAGE_NAME<==        Priority: $PRIORITY"
  495.      # Print out the description text:
  496.      BASE_DISK_NAME=`basename $PACKAGE_DIR/disk*`
  497. #     if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  498.       fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/disk* 2> /dev/null | uniq ;
  499. #     fi
  500.      if [ "$CURRENT_PACKAGE_EXTENSION" = ".tgz" ]; then
  501.       COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
  502.       UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
  503.       COMPRESSED="`expr $COMPBYTES / 1024`K"
  504.       UNCOMPRESSED="`expr $UNCOMPBYTES / 1024`K"
  505.       echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED."
  506.      else # uncompressed
  507.       echo "Size: This tar archive will use `expr $PACKAGE_SIZE / 1024`K of drive space."
  508.      fi
  509.      install_the_current_package;
  510.     elif [ "$SkipKey" != "SKIP" ]; then
  511.      echo "Package Name: ==>$CURRENT_PACKAGE_NAME<==        Priority: $PRIORITY"
  512. #     if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  513.       fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/disk* 2> /dev/null | uniq ;
  514. #     fi
  515.      if [ "$CURRENT_PACKAGE_EXTENSION" = ".tgz" ]; then
  516.       COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
  517.       UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
  518.       COMPRESSED="`expr $COMPBYTES / 1024`K"
  519.       UNCOMPRESSED="`expr $UNCOMPBYTES / 1024`K"
  520.       echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED."
  521.      else # uncompressed
  522.       echo "Size: This tar archive will use `expr $PACKAGE_SIZE / 1024`K of drive space."
  523.      fi
  524.      while [ 0 ]; do
  525.       echo -n "Install package ==>$CURRENT_PACKAGE_NAME<== ([y]es, [n]o, [q]uit adding software)? "
  526.       read REPLY;
  527.       if [ "$REPLY" = "y" ]; then
  528.        install_the_current_package;
  529.        break;
  530.       elif [ "$REPLY" = "n" ]; then
  531.        break;
  532.       elif [ "$REPLY" = "q" ]; then
  533.        umount_the_source;
  534.        chmod 755 $TARGET_DIR
  535.        chmod 1777 $TARGET_DIR/tmp
  536.        exit 1;
  537.       fi
  538.        echo
  539.       echo "Not a valid choice."
  540.       echo 
  541.      done
  542.     else
  543.      echo "Auto-skipping package ==>$CURRENT_PACKAGE_NAME<==       Priority: $PRIORITY" 
  544. #     if [ -r $PACKAGE_DIR/$BASE_DISK_NAME -a ! -d $PACKAGE_DIR/$BASE_DISK_NAME ]; then
  545.       fgrep "$CURRENT_PACKAGE_NAME:" $PACKAGE_DIR/disk* 2> /dev/null | uniq ;
  546. #     fi
  547.      if [ "$CURRENT_PACKAGE_EXTENSION" = ".tar" ]; then
  548.       echo "Size: This tar archive would have used `expr $PACKAGE_SIZE / 1024`K of drive space."
  549.      else
  550.       COMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b1-9`"
  551.       UNCOMPBYTES="`gzip -l $PACKAGE_DIR/$CURRENT_PACKAGE_NAME.tgz | sed -n '$ p' | cut -b10-19`"
  552.       COMPRESSED="`expr $COMPBYTES / 1024`K"
  553.       UNCOMPRESSED="`expr $UNCOMPBYTES / 1024`K"
  554.       echo "Size: Compressed: $COMPRESSED, uncompressed: $UNCOMPRESSED."
  555.      fi
  556.     fi
  557.    done
  558.   done
  559.   OUTTAHERE="false"
  560.   if [ -r $PACKAGE_DIR/install.end ]; then
  561.    OUTTAHERE="true"
  562.   fi
  563.   umount_the_source;
  564.   if [ "$OUTTAHERE" = "true" ]; then
  565.    return 1;
  566.   fi
  567.  else
  568.   umount_the_source;
  569.   if [ ! "$SOURCE_MOUNTED" = "always" ]; then
  570.    echo
  571.    echo -n "Incorrect disk, insert disk $1 and hit [enter], or [s] to skip series: "
  572.    read REPLY;
  573.    if [ "$REPLY" = "s" ]; then
  574.     return 1;
  575.    else
  576.     install_disk $1;
  577.    fi
  578.   else
  579.    cat << EOF
  580.  
  581. Can't find a disk series $SERIES_NAME in the source directory.
  582. Skipping it...
  583.  
  584. EOF
  585.    return 1; 
  586.   fi 
  587.  fi;
  588. }
  589. install_disk_set() { # accepts one argument: the series name in lowercase.
  590.  SERIES_NAME=$1
  591.  CURRENT_DISK_NUMBER="1";
  592.  while [ 0 ]; do
  593.   install_disk $SERIES_NAME$CURRENT_DISK_NUMBER;
  594.   if [ $? = 1 ]; then # install.end was found, or the user chose
  595.         # to quit installing packages.
  596.    return 0;
  597.   fi
  598.   CURRENT_DISK_NUMBER=`expr $CURRENT_DISK_NUMBER + 1`
  599.  done;
  600. }
  601. if [ "$DISK_SETS" = "disk" ]; then
  602.  install_disk single_disk;
  603.  ASK="always"
  604. else
  605.  touch $TMP/tagfile
  606.  chmod 600 $TMP/tagfile
  607.  if echo $DISK_SETS | fgrep "#a#" 1> /dev/null 2>&1; then
  608.   A_IS_NEEDED="true"
  609.  else
  610.   A_IS_NEEDED="false"
  611.  fi
  612.  while [ 0 ];
  613.  do
  614.   while [ 0 ]; # strip leading '#'s
  615.   do
  616.    if [ "`echo $DISK_SETS | cut -b1`" = "#" ]; then
  617.     DISK_SETS="`echo $DISK_SETS | cut -b2-`"
  618.    else
  619.     break;
  620.    fi
  621.   done
  622.   if [ "$A_IS_NEEDED" = "true" ]; then
  623.    if [ "$TARGET_DIR" = "/" ]; then
  624.     cat << EOF
  625.  
  626. *** WARNING!
  627.   Reinstalling your A series from the running system is not
  628.   a good idea. It is suggested that you use the bootdisk
  629.   instead. You may:
  630.   [a] - Abort software installation.
  631.   [i] - Ignore this warning and reinstall the A series anyway.
  632.         (at your own risk)!
  633.   [s] - skip the A series, but continue installing software.
  634.  
  635. EOF
  636.     echo -n "[a]bort, [i]gnore, or [s]kip? "
  637.     read WHATDO;
  638.     echo
  639.     if [ "$WHATDO" = "a" ]; then
  640.      echo "Aborting..."
  641.      echo
  642.      A_IS_NEEDED="false"
  643.      DISK_SETS=""
  644.      continue;
  645.     elif [ "$WHATDO" = "s" ]; then
  646.      echo "Skipping A series..."
  647.      echo
  648.      A_IS_NEEDED="false"
  649.      continue;
  650.     elif [ ! "$WHATDO" = "i" ]; then
  651.      continue; # unknown response
  652.     fi
  653.    fi
  654.    cat << EOF
  655.  
  656. --- Installing disk series ==>a<==
  657. EOF
  658.    install_disk_set a;
  659.    A_IS_NEEDED="false"
  660.   fi
  661.   count="1"
  662.   if [ "`echo $DISK_SETS | cut -b$count`" = "" ]; then
  663.    break; # we be done here :^)
  664.   else
  665.    count="2"
  666.    while [ 0 ]; do
  667.     if [ "`echo $DISK_SETS | cut -b$count`" = "" -o "`echo $DISK_SETS | cut -b$count`" = "#" ]; then
  668.      count="`expr $count - 1`"
  669.      break;
  670.     else
  671.      count="`expr $count + 1`"
  672.     fi
  673.    done
  674.   fi
  675.   diskset="`echo $DISK_SETS | cut -b1-$count`"
  676.   count="`expr $count + 1`"
  677.   DISK_SETS="`echo $DISK_SETS | cut -b$count-`"
  678.   if [ "$diskset" = "a" ]; then
  679.    continue; # we expect this to be done elsewhere
  680.   fi
  681.   cat << EOF
  682.  
  683. --- Installing disk series ==>$diskset<==
  684. EOF
  685.   install_disk_set $diskset; 
  686.  done
  687. fi
  688. if [ "$DISK_SETS" = "disk" -o "$CMD_START" = "true" ]; then
  689.  if [ -r $TMP/tagfile ]; then
  690.   rm $TMP/tagfile
  691.  fi
  692. fi
  693. chmod 755 $TARGET_DIR
  694. chmod 755 $TARGET_DIR/var
  695. chmod 1777 $TARGET_DIR/tmp
  696.